package com.example.stujava.module.reflex;

import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Type;

/**
 * 获取类的对象信息
 */
public class Unit2 {

    public static void main(String[] args) {
        Class c = Student.class;
        System.out.println("包名+类名称:" + c.getName());
        System.out.println("类名：" + c.getSimpleName());
        System.out.println("包名：" + c.getPackage());
        System.out.println("是否为接口：" + c.isInterface());
        System.out.println("是否是基本类型：" + c.isPrimitive());
        System.out.println("是否是数组对象：" + c.isArray());
        System.out.println("父类名称：" + c.getSuperclass().getName());
        System.out.println("访问权限：" + c.getSuperclass().getModifiers());
        Class<?>[] declaredClasses = c.getDeclaredClasses();//内部类
        Class<?> declaringClass = c.getDeclaringClass();//外部类

        //获取构造方法
        try {
            Constructor constructor = c.getConstructor();
            Constructor declaredConstructor = c.getDeclaredConstructor();
            Constructor<?> constructor2 = c.getDeclaredConstructor(String.class);   //获取指定声明构造函数
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }

        //获取方法
        Method[] declaredMethods = c.getDeclaredMethods();  //获取所有的方法
        Method[] methods = c.getMethods();      //获取所有public方法，包括父类方法
        declaredMethods[0].getReturnType();     //获取方法的返回值类型
        declaredMethods[0].getParameterTypes();     //获取方法的传参类型
        try {
            Method method = c.getMethod("info", String.class);  //返回次Class对象对应类的、带指定形参列表的public方法
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }

        //获取属性（变量）
        Field[] declaredFields = c.getDeclaredFields(); // 获取所有成员变量
        Field[] fields = c.getFields();     //获取类的public属性，包括父类继承下来的属性
        try {
            Field fields2 = c.getField("age");     //获取类的指定的public属性
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
        //c.getDeclaredField(参数类型.class,....);       // 获取特定的成员变量

        //获取类实现的接口
        Class[] interfaces = c.getInterfaces();

        Annotation[] annotations = (Annotation[]) c.getAnnotations();//获取class对象的所有注解
        Annotation annotation = (Annotation) c.getAnnotation(Deprecated.class);//获取class对象指定注解
        Type genericSuperclass = c.getGenericSuperclass();//获取class对象的直接超类的 Type
        Type[] interfaceTypes = c.getGenericInterfaces();//获取class对象的所有接口的type集合
    }


    public void example() {

    }


}
